package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.Apadrinado;
import ongd.negocio.gestion.ControladorApadrinamiento;
import ongd.negocio.gestion.Proyecto;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de insertar un apadrinado.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Insertar_Apadrinado extends ABean {

    /**
     * Objeto del tipo controladroApadrinamiento que nos servirá para realizar
     * todas las operaciones necesarias para crear un apadrinado.
     */
    private ControladorApadrinamiento contApad;
    
    /**
     * Objeto de tipo Apadrinado que corresponderá con el nuevo apadrinado que
     * se va a crear.
     */
    private Apadrinado apadrinado;
    
    /**
     * Objeto de tipo List que va a contener proyectos que serán asociados al
     * nuevo apadrinado.
     */
    private List<Proyecto> proyectos;
    
    /**
     * Objeto de tipo String que corresponderá con el nombre del proyecto
     * al que asociaremos el apadrinado.
     */
    private String proyectoNombre;
   
    /**
     * Booleano que dependiendo de su valor nos indicará si vamos a insertar
     * un apadrinado directamente en la base de datos.
     */
    private boolean insertarApadrinado;
    
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Constructor de la clase.
     */
    public Insertar_Apadrinado() {
        apadrinado = new Apadrinado();
        proyectos = new ArrayList<Proyecto>();
    }

    /**
     * Método que carga las variables iniciales tras elegir la página deseada.
     */
    @Override
    public void cargaInicial() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            if(sesion.iniciadaSesion()){
                titulo = "Insertar - Nuevo Apadrinado";
                contApad = sesion.getControladorApadrinamiento();
                if (sesion.getStrVariable().compareTo("si") == 0) {                    
                    insertarApadrinado = true;
                    proyectos = contApad.buscarProyectosTipo("AP");
                } else {
                    insertarApadrinado = false;
            }
            }
        }
    }

    /**
     * Método que guarda un apadrinado en la base de datos o en una lista, en
     * función de la variable insertarApadrinado.
     * @return null
     */
    public String guardar() {
        RequestContext requestContext = RequestContext.getCurrentInstance();
        if(getSesionBean().iniciadaSesion()){
            try {
                if (insertarApadrinado) {
                    if (proyectos != null) {
                        Proyecto p = contApad.buscarProyecto(proyectoNombre);
                        if (contApad.guardarApadrinado(apadrinado, p)) {
                            requestContext.addCallbackParam("finOK", true);
                            apadrinado = new Apadrinado();
                        } else {
                            requestContext.addCallbackParam("noCreado", true);
                        }
                    } else {
                        //Si no hemos elegido un proyecto salta un mensaje de error
                        requestContext.addCallbackParam("faltaProy", true);
                    }
                } else {
                    //Hemos llamado al metodo desde insertar proyecto, asique le guardamos en una lista
                    contApad.guardarApadrinadoLista(apadrinado);
                    requestContext.addCallbackParam("listaOK", true);
                    apadrinado = new Apadrinado();
                }
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(Insertar_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Insertar_Apadrinado.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que devuelve una lista con los nombres de los proyectos.
     * @return lista de nombres.
     */
    public List<String> getAvailableP() {
        if (proyectos != null) {
            List<String> availableP = new ArrayList<String>();
            for (Proyecto p : proyectos) {
                availableP.add(p.getNombre());
            }
            return availableP;
        }
        return null;
    }

    /**
     * Método que devuelve un apadrinado.
     * @return apadrinado
     * @see #setApadrinado
     */
    public Apadrinado getApadrinado() {
        return apadrinado;
    }

    /**
     * Método que devuelve el nombre de un proyecto.
     * @return nombre del proyecto
     * @see #setProyectoNombre
     */
    public String getProyectoNombre() {
        return proyectoNombre;
    }

    /**
     * Método que devuelve la lista de proyectos.
     * @return lista de proyecto
     * @see #setProyectos
     */
    public List<Proyecto> getProyectos() {
        return proyectos;
    }

    /**
     * Método que da un nuevo valor del apadrinado.
     * @param apadrinado nuevo apadrinado 
     * @see #getApadrinado
     */
    public void setApadrinado(Apadrinado apadrinado) {
        this.apadrinado = apadrinado;
    }

    /**
     * Método que asigna un nuevo nombre de proyecto.
     * @param proyectoNombre Nuevo valor de la variable
     * @see #getProyectoNombre
     */
    public void setProyectoNombre(String proyectoNombre) {
        this.proyectoNombre = proyectoNombre;
    }

    /**
     * Método que asigna una nueva lista de proyectos.
     * @param proyectos nueva lista. 
     * @see #getProyectos
     */
    public void setProyectos(List<Proyecto> proyectos) {
        this.proyectos = proyectos;
    }

    /**
     * Método que devuelve el valor de la variable insertarApadrinado.
     * @return valor de la variable booleana.
     */
    public boolean isInsertarApadrinado() {
        return insertarApadrinado;
    }
    
    /**
     * Método que devuelve la variable contApad.
     * @return contApad
     * @see #setContApad
     */
    public ControladorApadrinamiento getContApad() {
        return contApad;
    }

    /**
     * Método que establece un valor para la variable contApad.
     * @param contApad Nuevo valor de la variable
     * @see #getContApad
     */
    public void setContApad(ControladorApadrinamiento contApad) {
        this.contApad = contApad;
    }    
    
    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
